import { SetMetadata } from '@nestjs/common'
import { SKIP_RESPONSE_TRANSFORM, RESPONSE_MESSAGE } from '../interceptors/response.interceptor'

/**
 * 跳过响应转换装饰器
 * 用于跳过全局响应格式化，直接返回原始数据
 *
 * @example
 * ```typescript
 * @Get('download')
 * @SkipResponseTransform()
 * downloadFile() {
 *   // 返回文件流，不进行响应格式化
 *   return fileStream;
 * }
 * ```
 */
export const SkipResponseTransform = () => SetMetadata(SKIP_RESPONSE_TRANSFORM, true)

/**
 * 自定义响应消息装饰器
 * 用于设置自定义的成功响应消息
 *
 * @param message 自定义消息
 *
 * @example
 * ```typescript
 * @Post()
 * @ResponseMessage('用户创建成功')
 * createUser(@Body() createUserDto: CreateUserDto) {
 *   return this.userService.create(createUserDto);
 * }
 * ```
 */
export const ResponseMessage = (message: string) => SetMetadata(RESPONSE_MESSAGE, message)

/**
 * 缓存装饰器
 * 用于设置GET请求的缓存时间
 *
 * @param ttl 缓存时间（毫秒），默认5分钟
 *
 * @example
 * ```typescript
 * @Get()
 * @Cache(10 * 60 * 1000) // 缓存10分钟
 * findAll() {
 *   return this.service.findAll();
 * }
 * ```
 */
export const Cache = (ttl: number = 5 * 60 * 1000) => SetMetadata('cacheTTL', ttl)

/**
 * 跳过缓存装饰器
 * 用于跳过缓存，每次都执行实际查询
 *
 * @example
 * ```typescript
 * @Get('real-time')
 * @SkipCache()
 * getRealTimeData() {
 *   return this.service.getRealTimeData();
 * }
 * ```
 */
export const SkipCache = () => SetMetadata('skipCache', true)

/**
 * API响应装饰器组合
 * 提供常用的响应配置组合
 */
export class ApiResponse {
  /**
   * 成功响应装饰器
   * @param message 成功消息
   */
  static Success(message: string) {
    return ResponseMessage(message)
  }

  /**
   * 创建成功响应装饰器
   * @param resourceName 资源名称
   */
  static Created(resourceName: string = '资源') {
    return ResponseMessage(`${resourceName}创建成功`)
  }

  /**
   * 更新成功响应装饰器
   * @param resourceName 资源名称
   */
  static Updated(resourceName: string = '资源') {
    return ResponseMessage(`${resourceName}更新成功`)
  }

  /**
   * 删除成功响应装饰器
   * @param resourceName 资源名称
   */
  static Deleted(resourceName: string = '资源') {
    return ResponseMessage(`${resourceName}删除成功`)
  }

  /**
   * 查询成功响应装饰器
   * @param resourceName 资源名称
   */
  static Found(resourceName: string = '数据') {
    return ResponseMessage(`${resourceName}查询成功`)
  }

  /**
   * 操作成功响应装饰器
   * @param operation 操作名称
   */
  static Operation(operation: string) {
    return ResponseMessage(`${operation}成功`)
  }

  /**
   * 文件响应装饰器（跳过格式化）
   */
  static File() {
    return SkipResponseTransform()
  }

  /**
   * 流响应装饰器（跳过格式化）
   */
  static Stream() {
    return SkipResponseTransform()
  }

  /**
   * 原始数据响应装饰器（跳过格式化）
   */
  static Raw() {
    return SkipResponseTransform()
  }

  /**
   * 缓存响应装饰器
   * @param ttl 缓存时间（毫秒）
   * @param message 响应消息
   */
  static Cached(ttl: number = 5 * 60 * 1000, message?: string) {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
      Cache(ttl)(target, propertyKey, descriptor)
      if (message) {
        ResponseMessage(message)(target, propertyKey, descriptor)
      }
    }
  }

  /**
   * 实时数据响应装饰器（跳过缓存）
   * @param message 响应消息
   */
  static RealTime(message?: string) {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
      SkipCache()(target, propertyKey, descriptor)
      if (message) {
        ResponseMessage(message)(target, propertyKey, descriptor)
      }
    }
  }
}

/**
 * 分页响应装饰器
 * 用于标识返回分页数据的接口
 *
 * @param message 响应消息
 *
 * @example
 * ```typescript
 * @Get()
 * @PaginatedResponse('用户列表查询成功')
 * findAll(@Query() query: QueryUserDto) {
 *   return this.userService.findAll(query);
 * }
 * ```
 */
export const PaginatedResponse = (message: string = '分页查询成功') => {
  return ResponseMessage(message)
}

/**
 * 批量操作响应装饰器
 * 用于批量操作的响应
 *
 * @param operation 操作类型
 *
 * @example
 * ```typescript
 * @Delete('batch')
 * @BatchResponse('删除')
 * batchDelete(@Body() dto: BulkOperationDto) {
 *   return this.service.batchDelete(dto.ids);
 * }
 * ```
 */
export const BatchResponse = (operation: string) => {
  return ResponseMessage(`批量${operation}成功`)
}

/**
 * 统计数据响应装饰器
 * 用于统计数据接口
 *
 * @param dataType 数据类型
 *
 * @example
 * ```typescript
 * @Get('stats')
 * @StatsResponse('用户')
 * getStats() {
 *   return this.userService.getStats();
 * }
 * ```
 */
export const StatsResponse = (dataType: string = '数据') => {
  return ResponseMessage(`${dataType}统计查询成功`)
}

/**
 * 导出数据响应装饰器
 * 用于数据导出接口（通常返回文件）
 *
 * @param dataType 数据类型
 *
 * @example
 * ```typescript
 * @Get('export')
 * @ExportResponse('用户')
 * exportUsers(@Query() query: ExportUserDto) {
 *   return this.userService.exportUsers(query);
 * }
 * ```
 */
export const ExportResponse = (dataType: string = '数据') => {
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    SkipResponseTransform()(target, propertyKey, descriptor)
    ResponseMessage(`${dataType}导出成功`)(target, propertyKey, descriptor)
  }
}

/**
 * 导入数据响应装饰器
 * 用于数据导入接口
 *
 * @param dataType 数据类型
 *
 * @example
 * ```typescript
 * @Post('import')
 * @ImportResponse('用户')
 * importUsers(@UploadedFile() file: Express.Multer.File) {
 *   return this.userService.importUsers(file);
 * }
 * ```
 */
export const ImportResponse = (dataType: string = '数据') => {
  return ResponseMessage(`${dataType}导入成功`)
}

/**
 * 上传文件响应装饰器
 * 用于文件上传接口
 *
 * @param fileType 文件类型
 *
 * @example
 * ```typescript
 * @Post('upload')
 * @UploadResponse('图片')
 * uploadImage(@UploadedFile() file: Express.Multer.File) {
 *   return this.uploadService.uploadImage(file);
 * }
 * ```
 */
export const UploadResponse = (fileType: string = '文件') => {
  return ResponseMessage(`${fileType}上传成功`)
}

/**
 * 下载文件响应装饰器
 * 用于文件下载接口（跳过响应格式化）
 *
 * @example
 * ```typescript
 * @Get('download/:id')
 * @DownloadResponse()
 * downloadFile(@Param('id') id: string) {
 *   return this.fileService.downloadFile(id);
 * }
 * ```
 */
export const DownloadResponse = () => {
  return SkipResponseTransform()
}

/**
 * 健康检查响应装饰器
 * 用于健康检查接口
 *
 * @example
 * ```typescript
 * @Get('health')
 * @HealthResponse()
 * healthCheck() {
 *   return { status: 'ok', timestamp: new Date() };
 * }
 * ```
 */
export const HealthResponse = () => {
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    SkipResponseTransform()(target, propertyKey, descriptor)
    SkipCache()(target, propertyKey, descriptor)
  }
}

/**
 * 认证响应装饰器
 * 用于认证相关接口
 *
 * @param action 认证动作
 *
 * @example
 * ```typescript
 * @Post('login')
 * @AuthResponse('登录')
 * login(@Body() loginDto: LoginDto) {
 *   return this.authService.login(loginDto);
 * }
 * ```
 */
export const AuthResponse = (action: string) => {
  return ResponseMessage(`${action}成功`)
}

/**
 * 验证响应装饰器
 * 用于验证相关接口
 *
 * @param action 验证动作
 *
 * @example
 * ```typescript
 * @Post('verify-email')
 * @VerifyResponse('邮箱验证')
 * verifyEmail(@Body() dto: VerifyEmailDto) {
 *   return this.authService.verifyEmail(dto);
 * }
 * ```
 */
export const VerifyResponse = (action: string) => {
  return ResponseMessage(`${action}成功`)
}
